package com.ljy.utils;

import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;
import java.net.URI;

public class Doc {
    /**
     *
     * @param url 网址
     * @return 返回一个文档对象
     * @throws IOException
     */
    public Document getDocument(String url,String code) throws IOException {
        /**
         * 使用 HttpClient 获取网页文档对象
         * 使用 Jsoup 获取所需的信息
         * 注意事项：
         * ① 设置连接超时：其实就是让它不再继续，做无意义的尝试
         * ② 爬虫时被屏蔽了，就更换代理 IP
         * ③ 有些网站是设置只能浏览器才能访问的，这时候就要模拟浏览器
         * ④ 有些网站的编码不一定是UTF-8，也有可能是GBK
         */
        // 【HttpClient】
        // 1.创建httpclient实例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 2.创建httpget实例
        HttpGet httpget = new HttpGet(url);
        // 3.配置
        // 3.1模拟浏览器
        httpget.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
        // 3.2代理+超时
        //使用代理 IP
//      HttpHost proxy = new HttpHost("47.101.195.97",3128);
        RequestConfig config = RequestConfig.custom()//.setProxy(proxy)
                //设置连接超时
                .setConnectTimeout(10000) // 设置连接超时时间 10秒钟
                .setSocketTimeout(10000) // 设置读取超时时间10秒钟
                .build();
        httpget.setConfig(config);
        // 4执行get请求
        CloseableHttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        // 5获取返回实体
        String content = EntityUtils.toString(entity, code);

        //【Jsoup】
        // 5.2获取响应类型、内容
        System.out.println("Status:"+response.getStatusLine().getStatusCode());
        System.out.println("Content-Type:"+entity.getContentType().getValue());
        // 6解析网页 得到文档对象
        Document doc = Jsoup.parse(content);
        // 7.关闭流
        response.close(); // response关闭
        httpclient.close(); // httpClient关闭
        return doc;
    }
    public Document getDocument(String url) throws IOException {
        /**
         * 使用 HttpClient 获取网页文档对象
         * 使用 Jsoup 获取所需的信息
         * 注意事项：
         * ① 设置连接超时：其实就是让它不再继续，做无意义的尝试
         * ② 爬虫时被屏蔽了，就更换代理 IP
         * ③ 有些网站是设置只能浏览器才能访问的，这时候就要模拟浏览器
         * ④ 有些网站的编码不一定是UTF-8，也有可能是GBK
         */
        // 【HttpClient】
        // 1.创建httpclient实例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 2.创建httpget实例
        HttpGet httpget = new HttpGet(url);
        // 3.配置
        // 3.1模拟浏览器
        httpget.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
        // 3.2代理+超时
        //使用代理 IP
//      HttpHost proxy = new HttpHost("47.101.195.97",3128);
        RequestConfig config = RequestConfig.custom()//.setProxy(proxy)
                //设置连接超时
                .setConnectTimeout(10000) // 设置连接超时时间 10秒钟
                .setSocketTimeout(10000) // 设置读取超时时间10秒钟
                .build();
        httpget.setConfig(config);
        // 4执行get请求
        CloseableHttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        // 5获取返回实体
        String content = EntityUtils.toString(entity, "utf-8");

        //【Jsoup】
        // 5.2获取响应类型、内容
        System.out.println("Status:"+response.getStatusLine().getStatusCode());
        System.out.println("Content-Type:"+entity.getContentType().getValue());
        // 6解析网页 得到文档对象
        Document doc = Jsoup.parse(content);
        // 7.关闭流
        response.close(); // response关闭
        httpclient.close(); // httpClient关闭
        return doc;
    }
    public Document getDocument(URI url) throws IOException {
        /**
         * 使用 HttpClient 获取网页文档对象
         * 使用 Jsoup 获取所需的信息
         * 注意事项：
         * ① 设置连接超时：其实就是让它不再继续，做无意义的尝试
         * ② 爬虫时被屏蔽了，就更换代理 IP
         * ③ 有些网站是设置只能浏览器才能访问的，这时候就要模拟浏览器
         * ④ 有些网站的编码不一定是UTF-8，也有可能是GBK
         */
        // 【HttpClient】
        // 1.创建httpclient实例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 2.创建httpget实例
        HttpGet httpget = new HttpGet(url);
        // 3.配置
        // 3.1模拟浏览器
        httpget.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
        // 3.2代理+超时
        //使用代理 IP
//      HttpHost proxy = new HttpHost("47.101.195.97",3128);
        RequestConfig config = RequestConfig.custom()//.setProxy(proxy)
                //设置连接超时
                .setConnectTimeout(10000) // 设置连接超时时间 10秒钟
                .setSocketTimeout(10000) // 设置读取超时时间10秒钟
                .build();
        httpget.setConfig(config);
        // 4执行get请求
        CloseableHttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        // 5获取返回实体
        String content = EntityUtils.toString(entity, "gbk");

        //【Jsoup】
        // 5.2获取响应类型、内容
        System.out.println("Status:"+response.getStatusLine().getStatusCode());
        System.out.println("Content-Type:"+entity.getContentType().getValue());
        // 6解析网页 得到文档对象
        Document doc = Jsoup.parse(content);
        // 7.关闭流
        response.close(); // response关闭
        httpclient.close(); // httpClient关闭
        return doc;
    }
}
